package com.weijian.utils;

import com.weijian.config.VideoProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;

/**
 * 文件验证工具类
 * 用于验证上传文件的类型和大小
 */
@Component
public class FileValidationUtils {
    
    @Autowired
    private VideoProperties videoProperties;
    
    /**
     * 验证文件类型是否允许
     * @param file 上传的文件
     * @return 是否允许上传
     */
    public boolean isValidFileType(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        if (fileName == null || fileName.lastIndexOf('.') == -1) {
            return false;
        }
        
        String fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
        String allowedTypes = videoProperties.getUpload().getAllowedTypes();
        List<String> allowedExtensions = Arrays.asList(allowedTypes.split(","));
        
        return allowedExtensions.contains(fileExtension);
    }
    
    /**
     * 验证文件大小是否在限制范围内
     * @param file 上传的文件
     * @return 是否在限制范围内
     */
    public boolean isValidFileSize(MultipartFile file) {
        String maxSizeStr = videoProperties.getUpload().getMaxSize();
        long maxSizeBytes = parseSizeToBytes(maxSizeStr);
        return file.getSize() <= maxSizeBytes;
    }
    
    /**
     * 获取允许的文件类型列表
     * @return 允许的文件类型列表
     */
    public List<String> getAllowedFileTypes() {
        String allowedTypes = videoProperties.getUpload().getAllowedTypes();
        return Arrays.asList(allowedTypes.split(","));
    }
    
    /**
     * 获取最大文件大小（字节）
     * @return 最大文件大小（字节）
     */
    public long getMaxFileSizeBytes() {
        String maxSizeStr = videoProperties.getUpload().getMaxSize();
        return parseSizeToBytes(maxSizeStr);
    }
    
    /**
     * 获取缩略图尺寸
     * @return [宽度, 高度]
     */
    public int[] getThumbnailSize() {
        return new int[]{
            videoProperties.getUpload().getThumbnailWidth(),
            videoProperties.getUpload().getThumbnailHeight()
        };
    }
    
    /**
     * 解析文件大小字符串为字节数
     * 支持格式如：500MB, 1GB, 1024KB
     * @param sizeStr 大小字符串
     * @return 字节数
     */
    private long parseSizeToBytes(String sizeStr) {
        String upperSizeStr = sizeStr.toUpperCase();
        
        if (upperSizeStr.endsWith("KB")) {
            return Long.parseLong(upperSizeStr.replace("KB", "")) * 1024;
        } else if (upperSizeStr.endsWith("MB")) {
            return Long.parseLong(upperSizeStr.replace("MB", "")) * 1024 * 1024;
        } else if (upperSizeStr.endsWith("GB")) {
            return Long.parseLong(upperSizeStr.replace("GB", "")) * 1024 * 1024 * 1024;
        } else {
            return Long.parseLong(upperSizeStr);
        }
    }
    
    /**
     * 获取文件验证错误信息
     * @param file 上传的文件
     * @return 错误信息，如果验证通过返回null
     */
    public String getValidationError(MultipartFile file) {
        if (!isValidFileType(file)) {
            return "不支持的文件类型，仅支持：" + getAllowedFileTypes();
        }
        
        if (!isValidFileSize(file)) {
            long maxSizeBytes = getMaxFileSizeBytes();
            String maxSizeStr = formatBytes(maxSizeBytes);
            return "文件大小超过限制，最大允许：" + maxSizeStr;
        }
        
        return null;
    }
    
    /**
     * 格式化字节数为可读格式
     * @param bytes 字节数
     * @return 格式化字符串
     */
    private String formatBytes(long bytes) {
        if (bytes < 1024) return bytes + " B";
        if (bytes < 1024 * 1024) return (bytes / 1024) + " KB";
        if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)) + " MB";
        return (bytes / (1024 * 1024 * 1024)) + " GB";
    }
}